package com.watercube.common.pojo;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.math.BigDecimal;

import lombok.Data;
import lombok.EqualsAndHashCode;

@EqualsAndHashCode(callSuper = false)
@Data
public class BaseEntity extends BasePoJo {

	private String createUserId;// 创建人id
	private String createDate;// 创建时间
	private String createTime;// 创建日期
	private Byte status;// 逻辑删除状态 1：启用 0：删除
	private String remark;// 备注
	private String updateUserId;// 编辑人id
	private String updateDate;// 编 辑日期
	private String updateTime;// 编 辑时间
	private Integer updateVersion;// 编辑版本,锁

	/**
	   * 
	   */
	private static final long serialVersionUID = 1L;

	public void initForClearNull() {
		// 获取当前类
		Class<?> clazz = getClass();
		try {
			// 获取bean描述
			BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
			// 获取所有属性
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
			// 遍历属性
			for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
				// 如果属性值为null则处理
				if (null == propertyDescriptor.getReadMethod().invoke(this)) {
					Class<?> propertyType = propertyDescriptor.getPropertyType();
					// 如果属性类别为数字，则初始化为0
					if (Integer.class.isAssignableFrom(propertyType)) {
						propertyDescriptor.getWriteMethod().invoke(this, 0);
					} else if (Long.class.isAssignableFrom(propertyType)) {
						propertyDescriptor.getWriteMethod().invoke(this, 0L);
					} else if (Float.class.isAssignableFrom(propertyType)) {
						propertyDescriptor.getWriteMethod().invoke(this, 0f);
					} else if (Double.class.isAssignableFrom(propertyType)) {
						propertyDescriptor.getWriteMethod().invoke(this, 0d);
					} else if (BigDecimal.class.isAssignableFrom(propertyType)) {
						propertyDescriptor.getWriteMethod().invoke(this, new BigDecimal("0.0"));
					} else if (String.class.isAssignableFrom(propertyType)) {
						// 如果属性类别为字符串，则初始化为空格
						propertyDescriptor.getWriteMethod().invoke(this, " ");
					}
					// 其他类型不处理
				}
			}
		} catch (Exception e) {
			throw new RuntimeException("initForClearNull failed", e);
		}
	}

}
